package singleton

import (
	"fmt"
	"sync"
)

type tDualCheckSingleton struct {}


func newDualCheckSingleton() *tDualCheckSingleton {
	return &tDualCheckSingleton{}
}


func (me *tDualCheckSingleton) Hello() {
	fmt.Printf("tDualCheckSingleton.Hello\n")
}

var gDualCheckSingleton IDemoSingleton = nil
var gSingletonLock = new(sync.Mutex)

func GetDualCheckSingleton() IDemoSingleton {
	if gDualCheckSingleton == nil {
		gSingletonLock.Lock()
		defer gSingletonLock.Unlock()

		if gDualCheckSingleton == nil {
			gDualCheckSingleton = newDualCheckSingleton()
		}
	}

	return gDualCheckSingleton
}